MVC路由解析---UrlRoutingModule

文章引导

              MVC路由解析---IgnoreRoute 

              MVC路由解析---MapRoute 

              MVC路由解析---UrlRoutingModule  

              Area的使用

引言:

                此文全文内容90%转自

一.前言

                在MVC中,一个请求对应一个Controller的Action,熟悉asp.net的人应该知道,asp.net请求实际交给了HttpHandler进行了处理,HttpHandler就是ASP.NET的处理器。MVC的Action,请求都会交给HttpHandler。具体是在管道事件中,会根据请求创建一个HttpHandler,执行HttpHandler的ProcessRequest方法。

二.UrlRoutingModule

                MVC的路由机制是通过一个UrlRoutingModule完成的,它是一个实现了IHttpModule的类,HttpModule通过注册HttpApplication事件参与到管道处理请求中。具体是订阅HttpApplication某个阶段的事件。废话不多说,上源码

public class UrlRoutingModule:IHttpModule
{
    public RouteCollection _routeCollection;
  
    protected virtual void Init(HttpApplication application)
    {
         application.PostResolveRequestCache+=OnApplicationPostResolveRequestCache;
    }

    void OnApplicationPostResolveRequestCache(object sender,EventArgs e)
    {
          HttpApplication app=(HttpApplication)sender;
          HttpContextBase context=new HttpContextWrapper(app.Context);
          PostResolveRequestCache(context);
    }

    public virtual void PostResolveRequestCache(HttpContextBase context)
    {
          RouteData routeData=RouteCollection.GetRouteData(context);
          
          IRouteHandler routeHandler=routeData.RouteHandler;

          RequestContext requestContext=new RequestContext(context,routeData);
          context.Request.RequestContext=requestContext;
    
          IHttpHandler httpHandler=routeHandler.GetHttpHandler(requestContext);
          context.RemapHandler(httpHandler);
    }
}

                  我们看看UrlRoutingModule的路线图               

                          

                Route.GetRouteData:

public override RouteData GetRouteData(HttpContextBase httpContext)
{
     //AppRelativeCurrentExecutionFilePath:获取应用程序的虚拟路径,并通过对应用程序根使用波形符(~)表示法,(例:~/page.aspx)使该路径成为相对路径。
     //HttpRequest.PathInfo:获取扩展名的附加信息,例:对于 URL Http://www.contoso.com/virdir/page.html/tail,PathInfo 值为 /tail。
     string requestPath=httpContext.Request.AppRelativeCurrentExecutionFilePath.SubString(2)+httpContext.Request.PathInfo;
       
     RouteValueDictionary values=_parseRoute.Match(requestPath,Defaults);

     RouteData routeData=new RouteData(this,RouteHanlder);

     foreach(var item in values)
     {
          routeData.Values.Add(item.Key,value.Value);
     }

     //DataTokens
}

                 GetRouteData通过HttpContext来获取路由信息,形成RouteData,将URL与Defaults的Key进行匹配,形成RouteValueDictionary ,我们看看RouteData内部信息

                                属性:Route--->RouteData有参构造函数的参数Route

                                           RouteHandler--->RouteData有参构造函数的参数IRouteHandler

                                方法:GetRouteData---->return RouteData

                                           GetRequiredString---->string

                 上述的RouteHandler由Route的构造函数参数传入,  这里的Route来自于

                   

                                              

 

 

                            

 

posted @ 2018-06-29 17:11  小王子的博客  阅读(1678)  评论(0编辑  收藏  举报